// Copyright (C) 2019 Leo Balter. All rights reserved.
// This code is governed by the BSD license found in the LICENSE file.

/*---
esid: sec-Intl.DisplayNames
description: >
  Return abrupt completion from Locales invalid length
info: |
  Intl.DisplayNames ([ locales [ , options ]])

  1. If NewTarget is undefined, throw a TypeError exception.
  2. Let displayNames be ? OrdinaryCreateFromConstructor(NewTarget, "%DisplayNamesPrototype%",
    « [[InitializedDisplayNames]], [[Locale]], [[Style]], [[Type]], [[Fallback]], [[Fields]] »).
  3. Let requestedLocales be ? CanonicalizeLocaleList(locales).
  ...

  CanonicalizeLocaleList ( locales )

  1. If locales is undefined, then
    a. Return a new empty List.
  2. Let seen be a new empty List.
  3. If Type(locales) is String, then
    a. Let O be CreateArrayFromList(« locales »).
  4. Else,
    a. Let O be ? ToObject(locales).
  5. Let len be ? ToLength(? Get(O, "length")).

  ToLength ( argument )

  1. Let len be ? ToInteger(argument).
  ...
features: [Intl.DisplayNames, Symbol, BigInt]
---*/

function Test() {
    var locales = {
      length: {
        valueOf() {
          throw new Test262Error();
        }
      }
    };

    assert.throws(Test262Error, () => {
      new Intl.DisplayNames(locales);
    }, 'poisoned valueOf for ToNumber');

    locales.length = {
      [Symbol.toPrimitive]() {
        throw new Test262Error();
      }
    };
    assert.throws(Test262Error, () => {
      new Intl.DisplayNames(locales);
    }, 'poisoned ToPrimitive for ToNumber');

    locales.length = {
      toString() {
        throw new Test262Error();
      }
    };
    assert.throws(Test262Error, () => {
      new Intl.DisplayNames(locales);
    }, 'poisoned toString for ToNumber');

    locales.length = Symbol();
    assert.throws(TypeError, () => {
      new Intl.DisplayNames(locales);
    }, 'length is Symbol');

    locales.length = BigInt(1);
    assert.throws(TypeError, () => {
      new Intl.DisplayNames(locales);
    }, 'length is BigInt');
}

// preheat
const NUMBER_OF_PREHEAT = 1;
for (let i = 0; i < NUMBER_OF_PREHEAT; i++) {
    Test();
}

ArkTools.jitCompileAsync(Test);
assert.sameValue(ArkTools.waitJitCompileFinish(Test), true, '[JIT] JIT disabled.');

// test
const NUMBER_OF_TEST = 1; // or 2
for (let i = 0; i < NUMBER_OF_PREHEAT; i++) {
    Test();
}
